/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.marcelo.agro.core.api;

import java.io.File;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.List;
import org.marcelo.agro.entidades.*;
/**
 *
 * @author marcelo
 */
public interface ILotes extends IAccesoADatos<Lotes> {
    
    public static final BigDecimal MAX_VALUE = new BigDecimal (148940000000000L);
    public static final BigDecimal MIN_VALUE = BigDecimal.ZERO;
    public static int MAX_PRECISION_SUPERFICIE = 16;
    public static int MAX_PRECISION_TOTAL = 31;
    
    public static MathContext MATH_CONTEXT_UNLIMITED = MathContext.UNLIMITED;
    public static MathContext SUPERFICIE_MATH_CONTEXT = new MathContext(MAX_PRECISION_TOTAL, RoundingMode.HALF_UP);
    
    /**
     * Metodo para normalizar los datos de la superfici antes de guardarlos
     * @param superficie
     * @param factorMultiplicacion
     * @return
     * @throws Exception 
     */
    public BigDecimal supertificeAfundamental(BigDecimal superficie, BigDecimal factorMultiplicacion);
    
    public BigDecimal fundamentalAsuperficie(BigDecimal superficie, BigDecimal factorMultiplicacion);
    
    /**
     * 
     * @return 
     */
    public List<Departamento> getDepartamentos() ; 
    
    /**
     * 
     * @param departamento
     * @return 
     */
    public List<Distrito> getDistritos(Departamento departamento) ;
    
    /**
     * 
     * @return 
     */
    public List<Distrito> getDistritos();
    
    public Integer count();
    
    public void delete(Lotes lote) throws Exception;
    
    public List<LotesPorCampana> getLotesPorCampanas(Lotes lote) ;
    
    public List<Actividades> getActividades(Lotes lote) ;
    
    public Integer countLotesPorCampanias(Lotes lote) ;
    
    public Integer countActividades(Lotes lote) ;
    
    /**
     * Metodo para inicializar la base de datos con los datos minimos que permitan crear un lote
     * para este caso en concreto es Departamento y Distrito los datos que hay que meter en la base de datos
     * @throws Excepcion si no se puede inicializar la base de datos
     * @return Boolean que indica si se realizo con exito la operacion
     */
    public Boolean initBBDD() throws Exception;
    
    
    /**
     * Guardar un archivo CSV a la base de datos
     * Leer linea por linea cargar los datos y guardar en la bbdd
     */
    public boolean saveCSVtoLote(File file) throws Exception;
    
    public boolean saveLoteToCsv(File file) throws Exception;
    
    /**
     * Contar los lotes propios
     */
    public Integer countLotesPropios() ;
    
    /**
     * Contar los lotes Alquilados
     * 
     */
    public Integer countLotesAlquilados() ;
    
    public UnidadMedidaSuperficie getUnidadSuperficieById( int Id);
    
}
